GPUã¡ã¢ãªåž¯åå¹ ãçè§£ã»åŒ·åããWebGLããã©ãŒãã³ã¹ãæé©åãäžçäžã®ããã€ã¹ã§è»¢éé床ãåäžãããã¹ã ãŒãºãªã¬ã³ããªã³ã°ãå®çŸããæè¡ãåŠã³ãŸãã
WebGL GPUã¡ã¢ãªåž¯åå¹ ã®æé©åïŒè»¢éé床ã®åäž
æ¥éã«é²åãããŠã§ãéçºã®äžçã«ãããŠãWebGLã¯ãã©ãŠã¶å ã§çŽæ¥ãèŠèŠçã«è±ãã§ã€ã³ã¿ã©ã¯ãã£ããªäœéšãåµåºããããã®ç€ãšããŠç»å ŽããŸãããã°ã©ãã£ãã¯ã¹ããã»ãã·ã³ã°ãŠãããïŒGPUïŒã®ãã¯ãŒã掻çšãããã®èœåã«ãããéçºè ã¯è€éãª3Dã²ãŒã ããããŒã¿å¯èŠåããŒã«ãŸã§ãå€å²ã«ãããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããããããããã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã¯ããã€ãã®èŠå ã«å·Šå³ãããäžã§ãGPUã¡ã¢ãªåž¯åå¹ ã¯éåžžã«éèŠãªèŠçŽ ã§ãããã®ããã°èšäºã§ã¯ãWebGLã®GPUã¡ã¢ãªåž¯åå¹ ã®æé©åã®è€éãã«æ·±ãèžã¿èŸŒã¿ã転éé床ãåäžãããæçµçã«äžçäžã®å€æ§ãªããã€ã¹ã§ããã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒäœéšãæäŸããããã®ãã¯ããã¯ã«çŠç¹ãåœãŠãŸãã
GPUã¡ã¢ãªåž¯åå¹ ãšãã®éèŠæ§ã®çè§£
æé©åæŠç¥ã«é£ã³èŸŒãåã«ãåºæ¬çãªæŠå¿µãææ¡ããããšãäžå¯æ¬ ã§ããGPUã¡ã¢ãªåž¯åå¹ ãšã¯ãGPUãšã·ã¹ãã ã®ä»ã®éšåïŒCPUãGPUèªèº«ã®å éšã¡ã¢ãªãªã©ïŒãšã®éã§ããŒã¿ã転éã§ããé床ãæããŸãããã®è»¢éé床ã¯ã®ã¬ãã€ã/ç§ïŒGB/sïŒã§æž¬å®ãããå€ãã®WebGLã¢ããªã±ãŒã·ã§ã³ã«ãããŠå¶éèŠå ãšãªããŸãã垯åå¹ ãäžè¶³ãããšããã«ããã¯ãçããã¬ã³ããªã³ã°ã®é å»¶ããã¬ãŒã èœã¡ãå šäœçãªåäœã®éããšãã£ãããã©ãŒãã³ã¹åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
äžççãªã·ããªãªãèããŠã¿ãŸããããæ±äº¬ã®ãŠãŒã¶ãŒããããã€ã®äžåç£ã玹ä»ããããã«äœãããWebGLããŒã¹ã®å»ºç¯ããžã¥ã¢ã©ã€ãŒãŒã·ã§ã³ããŒã«ã«ã¢ã¯ã»ã¹ããŠãããšããŸãããã¯ã¹ãã£ãã¢ãã«ããã®ä»ã®ããŒã¿ãèªã¿èŸŒãŸããã¬ã³ããªã³ã°ãããé床ã¯ããŠãŒã¶ãŒã®äœéšã«çŽæ¥åœ±é¿ããŸããã¡ã¢ãªåž¯åå¹ ãå¶çŽãããŠããå Žåãã³ã³ãã³ãã®å質ã«é¢ãããããŠãŒã¶ãŒã¯é å»¶ããã©ã¹ãã¬ãŒã·ã§ã³ã®ããŸãã€ã³ã¿ã©ã¯ã·ã§ã³ãçµéšãããããããŸããã
ã¡ã¢ãªåž¯åå¹ ãéèŠãªçç±
- ããŒã¿è»¢éã®ããã«ããã¯ïŒ 倧éã®ããŒã¿ïŒãã¯ã¹ãã£ãé ç¹ããŒã¿ãªã©ïŒãGPUã«è»¢éãããšã垯åå¹ ã¯æ¥éã«æ¶è²»ãããŸããäžååãªåž¯åå¹ ã¯ããã«ããã¯ãçã¿åºããã¬ã³ããªã³ã°ãé ãããŸãã
- ãã¯ã¹ãã£ã®èªã¿èŸŒã¿ïŒ é«è§£å床ã®ãã¯ã¹ãã£ã¯ã¡ã¢ãªã倧éã«æ¶è²»ããŸãããã¯ã¹ãã£ãå¹ççã«èªã¿èŸŒã¿ã管çããããšãããã©ãŒãã³ã¹ã«ãšã£ãŠéèŠã§ãã
- é ç¹ããŒã¿ïŒ è€éãª3Dã¢ãã«ã«ã¯å€§éã®é ç¹ããŒã¿ãå¿ èŠã§ãããGPUãžã®å¹ççãªè»¢éãæ±ããããŸãã
- ãã¬ãŒã ã¬ãŒãïŒ åž¯åå¹ ã®å¶éã¯ãã¬ãŒã ã¬ãŒãã«çŽæ¥åœ±é¿ããŸãã垯åå¹ ãäœããšãã¬ãŒã ã¬ãŒããäœããªããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãäœäžããããã«æããããŸãã
- æ¶è²»é»åïŒ ã¡ã¢ãªåž¯åå¹ ãæé©åããããšã¯ã鿥çã«æ¶è²»é»åã®åæžã«ãè²¢ç®ããŸããããã¯ç¹ã«ã¢ãã€ã«ããã€ã¹ã«ãšã£ãŠéèŠã§ãã
äžè¬çãªWebGLã¡ã¢ãªåž¯åå¹ ã®ããã«ããã¯
WebGLã¢ããªã±ãŒã·ã§ã³ã«ãããŠãããã€ãã®é åãGPUã¡ã¢ãªåž¯åå¹ ã®ããã«ããã¯ã®åå ãšãªãåŸãŸãããããã®ããã«ããã¯ãç¹å®ããããšãã广çãªæé©åãžã®ç¬¬äžæ©ã§ãã
1. ãã¯ã¹ãã£ç®¡ç
ãã¯ã¹ãã£ã¯ãGPUã«è»¢éãããããŒã¿ã®äžã§æã倧ããªéšåãå ããããšããããããŸããäžé©åã«ç®¡çããããã¯ã¹ãã£ã¯ã垯åå¹ åé¡ã®äžè¬çãªåå ã§ãã
- é«è§£å床ãã¯ã¹ãã£ïŒ 衚瀺ãµã€ãºãèæ ®ããã«é床ã«å€§ããªãã¯ã¹ãã£è§£å床ã䜿çšããããšã¯ã垯åå¹ ãèããæ¶èãããŸãã
- éå§çž®ãã¯ã¹ãã£ïŒ éå§çž®ã®ãã¯ã¹ãã£åœ¢åŒã¯å§çž®ããããã®ãããå€ãã®ã¡ã¢ãªãæ¶è²»ãã垯åå¹ ã®éèŠãå¢å€§ãããŸãã
- é »ç¹ãªãã¯ã¹ãã£ã®ã¢ããããŒãïŒ åããã¯ã¹ãã£ãç¹°ãè¿ãGPUã«ã¢ããããŒãããããšã¯ã垯åå¹ ã®ç¡é§é£ãã§ãã
äŸïŒ 補åç»åã衚瀺ããã°ããŒãã«ãªEã³ããŒã¹ãã©ãããã©ãŒã ãèããŠã¿ãŸããããå補åç»åãé«è§£å床ã®éå§çž®ãã¯ã¹ãã£ã䜿çšããŠããå ŽåãããŒãžã®èªã¿èŸŒã¿æéã¯å€§å¹ ã«åœ±é¿ãåããç¹ã«ã€ã³ã¿ãŒãããæ¥ç¶ãé ãå°åã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯é¡èã§ãã
2. é ç¹ããŒã¿ç®¡ç
3Dã¢ãã«ã®å¹ŸäœåŠçæ å ±ã衚ãé ç¹ããŒã¿ãã垯åå¹ ã®äœ¿çšã«å¯äžããŸãã
- éå°ãªé ç¹ããŒã¿ïŒ èŠèŠçã«ã¯åçŽã§ãã£ãŠããé ç¹æ°ãå€ãã¢ãã«ã¯ããå€ãã®ããŒã¿è»¢éãå¿ èŠãšããŸãã
- æé©åãããŠããªãé ç¹ãã©ãŒãããïŒ äžå¿ èŠã«é«ç²ŸåºŠã®é ç¹ãã©ãŒãããã䜿çšãããšã転éãããããŒã¿éãå¢å ããå¯èœæ§ããããŸãã
- é »ç¹ãªé ç¹ããŒã¿ã®æŽæ°ïŒ ã¢ãã¡ãŒã·ã§ã³ã¢ãã«ã®ããã«ãåžžã«é ç¹ããŒã¿ãæŽæ°ããå Žåãããªãã®åž¯åå¹ ãå¿ èŠã«ãªããŸãã
äŸïŒ é«ããªãŽã³æ°ã®ã¢ãã«ã䜿çšããã°ããŒãã«ãª3Dã²ãŒã ã¯ãGPUã¡ã¢ãªåž¯åå¹ ãéãããããã€ã¹ã§ããã©ãŒãã³ã¹ã®äœäžãçµéšããŸããããã¯ãã¢ãã€ã«ã²ãŒã ãçããªã€ã³ãã®ãããªåœã®ãã¬ã€ã€ãŒã®ã²ãŒã äœéšã«åœ±é¿ãäžããŸãã
3. ãããã¡ç®¡ç
WebGLã¯ãGPUçšã®ããŒã¿ãæ ŒçŽããããã«ãããã¡ïŒé ç¹ãããã¡ãã€ã³ããã¯ã¹ãããã¡ïŒãå©çšããŸããéå¹ççãªãããã¡ç®¡çã¯ã垯åå¹ ã®ç¡é§ã«ã€ãªããå¯èœæ§ããããŸãã
- äžèŠãªãããã¡æŽæ°ïŒ å¿ èŠãªããšãã«é »ç¹ã«ãããã¡ãæŽæ°ããããšã¯ããªãœãŒã¹ã®ç¡é§ã§ãã
- éå¹ççãªãããã¡å²ãåœãŠïŒ é »ç¹ã«ãããã¡ãå²ãåœãŠããè§£æŸããããããšããªãŒããŒããããå¢å ããå¯èœæ§ããããŸãã
- äžé©åãªãããã¡äœ¿çšãã©ã°ïŒ ééã£ããããã¡äœ¿çšãã©ã°ïŒäŸïŒ`gl.STATIC_DRAW`, `gl.DYNAMIC_DRAW`ïŒã䜿çšãããšãããã©ãŒãã³ã¹ã劚ããå¯èœæ§ããããŸãã
äŸïŒ ãªã¢ã«ã¿ã€ã ã®æ ªåŒåžå ŽããŒã¿ã衚瀺ããããŒã¿å¯èŠåã¢ããªã±ãŒã·ã§ã³ã¯ãé »ç¹ã«ãããã¡ãæŽæ°ããå¿ èŠããããŸããäžé©åãªãããã¡äœ¿çšã¯ããã¬ãŒã ã¬ãŒããšå¿çæ§ã«å€§ããªåœ±é¿ãäžãããã³ãã³ããã¥ãŒãšãŒã¯ãªã©ã®éèããã®ãŠãŒã¶ãŒã«åœ±é¿ãåãŒããŸãã
4. ã·ã§ãŒããŒã³ã³ãã€ã«ãšãŠããã©ãŒã æŽæ°
çŽæ¥ã¡ã¢ãªåž¯åå¹ ã«é¢é£ããããã§ã¯ãããŸããããã·ã§ãŒããŒã®ã³ã³ãã€ã«ãé »ç¹ãªãŠããã©ãŒã ã®æŽæ°ã¯ãã¬ã³ããªã³ã°ãé ãããæ¬æ¥ã¡ã¢ãªè»¢é管çã«å ãŠãããã¹ãCPUãªãœãŒã¹ãæ¶è²»ããããšã§ã鿥çã«ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- è€éãªã·ã§ãŒããŒïŒ ããè€éãªã·ã§ãŒããŒã¯ãã³ã³ãã€ã«ã«ããå€ãã®æéãå¿ èŠãšããŸãã
- é »ç¹ãªãŠããã©ãŒã æŽæ°ïŒ ãŠããã©ãŒã ïŒã·ã§ãŒããŒã«æž¡ãããå€ïŒãããŸãã«ãé »ç¹ã«æŽæ°ãããšãç¹ã«æŽæ°ã倧éã®ããŒã¿è»¢éã䌎ãå Žåã«ããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
äŸïŒ èŠèŠå¹æã«è€éãªã·ã§ãŒããŒã䜿çšããŠãäžçäžã®ããŸããŸãªæ°è±¡ãã¿ãŒã³ã瀺ãWebGLããŒã¹ã®å€©æ°ã·ãã¥ã¬ãŒã·ã§ã³ã¯ãã·ã§ãŒããŒã®ã³ã³ãã€ã«ãšãŠããã©ãŒã ã®æŽæ°ãæé©åããããšã§å€§ããªæ©æµãåããã§ãããã
æé©åãã¯ããã¯ïŒè»¢éé床ã®åäž
ããã§ã¯ãäžèšã®ããã«ããã¯ã«å¯ŸåŠããããšã§WebGLã®ããã©ãŒãã³ã¹ãæé©åããããã®å®è·µçãªãã¯ããã¯ãæ¢ã£ãŠã¿ãŸãããããããã®ãã¯ããã¯ã¯ãGPUã¡ã¢ãªåž¯åå¹ ã®å©çšãæ¹åãã転éé床ãåäžãããããšãç®çãšããŠããŸãã
1. ãã¯ã¹ãã£ã®æé©å
ãã¯ã¹ãã£ã®æé©åã¯ãããŒã¿è»¢éãæå°éã«æããããã«éåžžã«éèŠã§ãã
- ãã¯ã¹ãã£å§çž®ïŒ ETC1/2ïŒã¢ãã€ã«çšïŒãS3TC/DXTïŒãã¹ã¯ãããçšïŒãªã©ã®ãã¯ã¹ãã£å§çž®åœ¢åŒãå©çšããŠããã¯ã¹ãã£ãµã€ãºãšã¡ã¢ãªåž¯åå¹ ã®äœ¿çšéãå€§å¹ ã«åæžããŸããWebGL 2.0ã¯ããŸããŸãªå§çž®åœ¢åŒããµããŒãããŠããããã©ãŠã¶ã®ãµããŒãã¯ããã€ã¹ã«ãã£ãŠç°ãªããŸããç¹å®ã®åœ¢åŒããµããŒãããŠããªãããã€ã¹ã®ããã®ãã©ãŒã«ããã¯ãæ€èšããŠãã ããã
- ããããããã³ã°ïŒ ãã¯ã¹ãã£ã«ãããããããçæããŸããããããããã¯ãäºåã«èšç®ãããäœè§£å床ã®ãã¯ã¹ãã£ããŒãžã§ã³ã§ããGPUã¯ãã«ã¡ã©ããã®ãªããžã§ã¯ãã®è·é¢ã«åºã¥ããŠé©åãªããããããã¬ãã«ãéžæã§ããå¯èœãªéãå°ãããã¯ã¹ãã£ã䜿çšããããšã§åž¯åå¹ ãç¯çŽããŸãã
- ãã¯ã¹ãã£ã®ãµã€ãºãšè§£ååºŠïŒ èŠèŠçãªèŠä»¶ã«åãããŠãã¯ã¹ãã£ã®ãµã€ãºã倿ŽããŸããäœè§£å床ã§ãã衚瀺ãããªãå°ããªUIèŠçŽ ã«4Kãã¯ã¹ãã£ã䜿çšããªãã§ãã ãããããã€ã¹ã®ç»é¢è§£å床ãèæ ®ããŠãã ããã
- ãã¯ã¹ãã£ã¢ãã©ã¹ïŒ è€æ°ã®å°ããªãã¯ã¹ãã£ã1ã€ã®å€§ããªãã¯ã¹ãã£ã¢ãã©ã¹ã«ãŸãšããŸããããã«ããããã¯ã¹ãã£ã®ãã€ã³ãæ°ãæžããããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸããããã¯UIèŠçŽ ãå°ããç¹°ãè¿ããããã¯ã¹ãã£ã«ç¹ã«åœ¹ç«ã¡ãŸãã
- é å»¶èªã¿èŸŒã¿ãšãã¯ã¹ãã£ã¹ããªãŒãã³ã°ïŒ äžåºŠã«ãã¹ãŠãèªã¿èŸŒãã®ã§ã¯ãªããå¿ èŠã«å¿ããŠãã¯ã¹ãã£ãèªã¿èŸŒã¿ãŸãããã¯ã¹ãã£ã¹ããªãŒãã³ã°ã«ãããGPUã¯ããã¯ã°ã©ãŠã³ãã§ãã«è§£å床ãèªã¿èŸŒãŸããŠããéã«ãäœè§£å床ããŒãžã§ã³ã®ãã¯ã¹ãã£ãã¬ã³ããªã³ã°ã§ããŸããããã«ãããç¹ã«å€§ããªãã¯ã¹ãã£ã®å Žåãåæã®èªã¿èŸŒã¿äœéšãã¹ã ãŒãºã«ãªããŸãã
äŸïŒ äžçäžã®èгå å°ã玹ä»ããã°ããŒãã«ãªèгå ãŠã§ããµã€ãã§ã¯ãæé©åããããã¯ã¹ãã£ãåªå ãã¹ãã§ãã芳å åæïŒäŸïŒããªã®ãšããã§ã«å¡ãäžåœã®äžéã®é·åïŒã®ç»åã«ã¯å§çž®ãã¯ã¹ãã£ã䜿çšããåãã¯ã¹ãã£ã«ãããããããçæããŸããããã«ãããã©ã®ããã€ã¹ã®ãŠãŒã¶ãŒã«ãé«éãªèªã¿èŸŒã¿äœéšãä¿èšŒãããŸãã
2. é ç¹ããŒã¿ã®æé©å
é ç¹ããŒã¿ã®å¹ççãªç®¡çã¯ãæé©ãªããã©ãŒãã³ã¹ã«ãšã£ãŠäžå¯æ¬ ã§ãã
- ã¢ãã«ã®ç°¡ç¥åïŒ é ç¹ã®æ°ãæžããããšã§ã¢ãã«ãç°¡ç¥åããŸããããã¯3Dã¢ããªã³ã°ããã°ã©ã ã§æåã§è¡ãããã¡ãã·ã¥ãã·ã¡ãŒã·ã§ã³ãªã©ã®æè¡ã䜿çšããŠèªåçã«è¡ãããšãã§ããŸãã
- é ç¹å±æ§ïŒ é ç¹å±æ§ãæ éã«éžæããŸããå¿ èŠãªå±æ§ïŒäœçœ®ãæ³ç·ããã¯ã¹ãã£åº§æšãªã©ïŒã®ã¿ãå«ããŸãã
- é ç¹ãã©ãŒãããïŒ é ç¹å±æ§ã«ã¯å¯èœãªéãå°ããããŒã¿åã䜿çšããŸããäŸãã°ã`gl.HALF_FLOAT`ïŒãµããŒããããŠããã°ïŒã§ååãªå Žåã«`gl.FLOAT`ã䜿çšãããªã©ã§ãã
- é ç¹ãããã¡ãªããžã§ã¯ãïŒVBOïŒãšèŠçŽ ãããã¡ãªããžã§ã¯ãïŒEBOïŒïŒ VBOãšEBOã䜿çšããŠãé ç¹ããŒã¿ãšã€ã³ããã¯ã¹ããŒã¿ãGPUã®ã¡ã¢ãªã«æ ŒçŽããŸããããã«ãããæ¯ãã¬ãŒã ããŒã¿ã転éããå¿ èŠããªããªããŸãã
- ã€ã³ã¹ã¿ã³ã·ã³ã°ïŒ ã€ã³ã¹ã¿ã³ã·ã³ã°ã䜿çšããŠãåãã¢ãã«ã®è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãå¹ççã«æç»ããŸããããã«ãããé ç¹ããŒã¿ã®è»¢éã¯äžåºŠã ãã§æžã¿ãŸãã
- é ç¹ãã£ãã·ã³ã°ïŒ é »ç¹ã«å€æŽãããªãé ç¹ããŒã¿ããã£ãã·ã¥ããŸããåãããŒã¿ãæ¯ãã¬ãŒã GPUã«åã¢ããããŒãããããšãé¿ããŸãã
äŸïŒ åºå€§ãªãªãŒãã³ã¯ãŒã«ããç¹åŸŽãšããWebGLããŒã¹ã®ã²ãŒã ãé ç¹ããŒã¿ã®æé©åã¯éåžžã«éèŠã§ããæšã岩ããã®ä»ã®ç¹°ãè¿ããããªããžã§ã¯ãã®æç»ã«ã¯ã€ã³ã¹ã¿ã³ã·ã³ã°ãå©çšããŸããé ãã®ãªããžã§ã¯ãã«ã¯ã¢ãã«ç°¡ç¥åæè¡ãæ¡çšããŠãã¬ã³ããªã³ã°ãããé ç¹ã®æ°ãæžãããŸãã
3. ãããã¡ç®¡çã®æé©å
é©åãªãããã¡ç®¡çã¯ã垯åå¹ ã®äœ¿çšãæå°éã«æããããã«äžå¯æ¬ ã§ãã
- ãããã¡äœ¿çšãã©ã°ïŒ ãããã¡ãäœæããéã«ã¯æ£ãããããã¡äœ¿çšãã©ã°ã䜿çšããŸããã»ãšãã©å€æŽãããªãããŒã¿ã«ã¯`gl.STATIC_DRAW`ãé »ç¹ã«æŽæ°ãããããŒã¿ã«ã¯`gl.DYNAMIC_DRAW`ãæ¯ãã¬ãŒã 倿ŽãããããŒã¿ã«ã¯`gl.STREAM_DRAW`ã䜿çšããŸãã
- ãããã¡æŽæ°ïŒ ãããã¡ã®æŽæ°ãæå°éã«æããŸããäžå¿ èŠã«ãããã¡ãæŽæ°ããªãããã«ããŸãã倿Žããããããã¡ã®éšåã®ã¿ãæŽæ°ããŸãã
- ãããã¡ãããã³ã°ïŒ `gl.mapBufferRange()`ïŒãµããŒããããŠããã°ïŒã䜿çšããŠããããã¡ã®ã¡ã¢ãªã«çŽæ¥ã¢ã¯ã»ã¹ããããšãæ€èšããŸããããã¯ãç¹ã«é »ç¹ã§å°ããªæŽæ°ã®å Žåã`gl.bufferSubData()`ãããé«éã«ãªãããšããããŸãã
- ãããã¡ããŒã«ïŒ åçãããã¡ã«ã¯ããããã¡ããŒã«ãå®è£ ããŸããé »ç¹ã«äœæã»ç Žæ£ãã代ããã«ãæ¢åã®ãããã¡ãåå©çšããŸãã
- é »ç¹ãªãããã¡ãã€ã³ãã®åé¿ïŒ ãããã¡ããã€ã³ãããã³ã¢ã³ãã€ã³ãããåæ°ãæå°éã«æããŸããæç»åŒã³åºãããããåŠçããŠããªãŒããŒããããåæžããŸãã
äŸïŒ åçãªããŒã¿ã衚瀺ãããªã¢ã«ã¿ã€ã ã®ã°ã©ãå¯èŠåããŒã«ãããŒã¿ãã€ã³ããå«ãé ç¹ãããã¡ã«ã¯`gl.DYNAMIC_DRAW`ã䜿çšããŸããæ¯ãã¬ãŒã ãããã¡å šäœãåã¢ããããŒãããã®ã§ã¯ãªãã倿Žãããéšåã®ã¿ãæŽæ°ããŸãããããã¡ãªãœãŒã¹ãå¹ççã«ç®¡çããããã«ãããã¡ããŒã«ãå®è£ ããŸãã
4. ã·ã§ãŒããŒãšãŠããã©ãŒã ã®æé©å
ã·ã§ãŒããŒã®äœ¿çšæ³ãšãŠããã©ãŒã ã®æŽæ°ãæé©åããããšã§ãå šäœçãªããã©ãŒãã³ã¹ãåäžããŸãã
- ã·ã§ãŒããŒã³ã³ãã€ã«ïŒ å¯èœã§ããã°ã·ã§ãŒããŒãäºåã³ã³ãã€ã«ããŠãå®è¡æã®ã³ã³ãã€ã«ãé¿ããŸããã·ã§ãŒããŒãã£ãã·ã³ã°ã¡ã«ããºã ãå©çšããŸãã
- ã·ã§ãŒããŒã®è€éãïŒ ã·ã§ãŒããŒã³ãŒããå¹ççã«æé©åããŸããã·ã§ãŒããŒããžãã¯ãç°¡çŽ åããèšç®åæ°ãæžãããäžèŠãªåå²ãé¿ããŸãã
- ãŠããã©ãŒã æŽæ°ïŒ ãŠããã©ãŒã ã®æŽæ°é »åºŠãæå°éã«æããŸããå¯èœã§ããã°ããŠããã©ãŒã ã®æŽæ°ãã°ã«ãŒãåããŸããWebGL 2.0ã§ã¯ãŠããã©ãŒã ãããã¡ïŒUBOïŒã䜿çšããŠãå€§èŠæš¡ãªãŠããã©ãŒã ã»ãããå¹ççã«æŽæ°ããããšãæ€èšããŸãã
- ãŠããã©ãŒã ããŒã¿åïŒ ãŠããã©ãŒã ã«ã¯æãå¹ççãªããŒã¿åã䜿çšããŸããå¯èœã§ããã°ãå粟床浮åå°æ°ç¹æ°ã§ã¯ãªãå粟床浮åå°æ°ç¹æ°ãéžæããŸãã
- ãŠããã©ãŒã ãããã¯ãªããžã§ã¯ãïŒUBOïŒïŒ é »ç¹ãªãŠããã©ãŒã æŽæ°ã«ã¯ããŠããã©ãŒã ãããã¯ãªããžã§ã¯ãïŒUBOïŒã䜿çšããŸããUBOã䜿çšãããšãè€æ°ã®ãŠããã©ãŒã 倿°ããŸãšããŠã°ã«ãŒãåããäžåºŠã«GPUã«ã¢ããããŒãããŠãããå¹ççã«æŽæ°ã§ããŸããæ³šæïŒWebGL 1.0ã¯UBOããµããŒãããŠããŸããããWebGL 2.0ã¯ãµããŒãããŠããŸãã
äŸïŒ è€éãªç©çã·ã¹ãã ã®WebGLããŒã¹ã®ã·ãã¥ã¬ãŒã·ã§ã³ãèšç®è² è·ãæžããããã«ã·ã§ãŒããŒãæé©åããŸããéåã颚åãªã©ã®ãã©ã¡ãŒã¿ã®ãŠããã©ãŒã æŽæ°åæ°ãæå°éã«æããŸããæŽæ°ãããã©ã¡ãŒã¿ãå€ãå Žåã¯ããŠããã©ãŒã ãããã¡ã®äœ¿çšãæ€èšããŸãã
5. ã³ãŒãã¬ãã«ã®æé©å
åºç€ãšãªãJavaScriptã³ãŒããæé©åããããšã§ãWebGLã®ããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããŸãã
- JavaScriptãããã¡ã€ãªã³ã°ïŒ ãã©ãŠã¶ã®éçºè ããŒã«ïŒChrome DevToolsãFirefox Developer Toolsãªã©ïŒã䜿çšããŠJavaScriptã³ãŒãããããã¡ã€ãªã³ã°ããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãã
- äžèŠãªæäœã®åé¿ïŒ äžèŠãªèšç®ãã«ãŒãã颿°åŒã³åºããåé€ããŸãã
- ãã£ãã·ã³ã°ïŒ ãã¯ã¹ãã£ãã³ãã«ããããã¡ãªããžã§ã¯ãããŠããã©ãŒã ãã±ãŒã·ã§ã³ãªã©ãé »ç¹ã«ã¢ã¯ã»ã¹ãããããŒã¿ããã£ãã·ã¥ããŸãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®æé©åïŒ ããã©ãŒãã³ã¹ã«å¯Ÿããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åœ±é¿ãæžããããã«ãã¡ã¢ãªã®å²ãåœãŠãšè§£æŸãæå°éã«æããŸãã
- Webã¯ãŒã«ãŒã®äœ¿çšïŒ èšç®éã®å€ãã¿ã¹ã¯ãWebã¯ãŒã«ãŒã«ãªãããŒãããŠãã¡ã€ã³ã¹ã¬ããã®ããããã³ã°ãé²ããŸããããã¯ãã¢ãã«ã®èªã¿èŸŒã¿ãããŒã¿åŠçãªã©ã®ã¿ã¹ã¯ã«ç¹ã«åœ¹ç«ã¡ãŸãã
äŸïŒ å€§èŠæš¡ãªããŒã¿ã»ããã§ããŒã¿åŠçãå®è¡ãããããŒã¿å¯èŠåããã·ã¥ããŒããããŒã¿åŠçãšãããã¡ããŒã¿ã®æºåãWebã¯ãŒã«ãŒã«ç§»åãããããšã§ãã¡ã€ã³ã¹ã¬ãããWebGLã¬ã³ããªã³ã°ã®ããã«è§£æŸããç¹ã«äœéãªããã€ã¹ãã€ã³ã¿ãŒãããæ¥ç¶ã®ãŠãŒã¶ãŒã«ãšã£ãŠUIã®å¿çæ§ãåäžãããŸãã
ããã©ãŒãã³ã¹æž¬å®ããã³ç£èŠã®ããã®ããŒã«ãšãã¯ããã¯
æé©åã¯å埩çãªããã»ã¹ã§ããããã©ãŒãã³ã¹ã枬å®ãç£èŠããããšã¯ãããã«ããã¯ãç¹å®ããæé©åã®åãçµã¿ãæ€èšŒããããã«äžå¯æ¬ ã§ããããã€ãã®ããŒã«ãšãã¯ããã¯ã圹ç«ã¡ãŸãã
- ãã©ãŠã¶éçºè ããŒã«ïŒ ChromeãFirefoxãSafariãEdgeãªã©ã®ãã©ãŠã¶ã«çµã¿èŸŒãŸããŠããéçºè ããŒã«ãå©çšããŸãããããã®ããŒã«ã¯JavaScriptãšWebGLã®ãããã¡ã€ãªã³ã°æ©èœãæäŸããã³ãŒãå ã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ãããã¬ãŒã ã¬ãŒãïŒFPSïŒãæç»åŒã³åºãããã®ä»ã®ã¡ããªã¯ã¹ã枬å®ã§ããŸãã
- WebGLãããã¬ãŒæ¡åŒµæ©èœïŒ ãã©ãŠã¶çšã®WebGLãããã°æ¡åŒµæ©èœïŒäŸïŒChromeããã³Firefoxçšã®WebGL InspectorïŒãã€ã³ã¹ããŒã«ããŸãããããã®æ¡åŒµæ©èœã¯ãã·ã§ãŒããŒã³ãŒãã®æ€æ»ããã¯ã¹ãã£ããŒã¿ã®è¡šç€ºãæç»åŒã³åºãã®è©³çްãªåæãªã©ãé«åºŠãªãããã°æ©èœãæäŸããŸãã
- ããã©ãŒãã³ã¹ã¡ããªã¯ã¹APIïŒ JavaScriptã®`performance.now()` APIã䜿çšããŠãç¹å®ã®ã³ãŒãã»ã¯ã·ã§ã³ã®å®è¡æéãæž¬å®ããŸããããã«ãããç¹å®ã®æäœã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãç¹å®ã§ããŸãã
- ãã¬ãŒã ã¬ãŒãã«ãŠã³ã¿ãŒïŒ ç°¡åãªãã¬ãŒã ã¬ãŒãã«ãŠã³ã¿ãŒãå®è£ ããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãç£èŠããŸãã1ç§ãããã«ã¬ã³ããªã³ã°ããããã¬ãŒã æ°ïŒFPSïŒã远跡ããŠãæé©åã®åãçµã¿ã®å¹æãè©äŸ¡ããŸãã
- GPUãããã¡ã€ãªã³ã°ããŒã«ïŒ ããã€ã¹ã§å©çšå¯èœãªå Žåã¯ãå°çšã®GPUãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŸãããããã®ããŒã«ã¯ãã¡ã¢ãªåž¯åå¹ ã®äœ¿çšç¶æ³ãã·ã§ãŒããŒã®ããã©ãŒãã³ã¹ãªã©ãGPUã®ããã©ãŒãã³ã¹ã«é¢ããããè©³çŽ°ãªæ å ±ãæäŸããŸãã
- ãã³ãããŒã¯ïŒ ããŸããŸãªæ¡ä»¶äžã§ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãè©äŸ¡ããããã®ãã³ãããŒã¯ãã¹ããäœæããŸãããããã®ãã³ãããŒã¯ãããŸããŸãªããã€ã¹ããã©ãŠã¶ã§å®è¡ããŠããã©ãããã©ãŒã éã§äžè²«ããããã©ãŒãã³ã¹ã確ä¿ããŸãã
äŸïŒ ã°ããŒãã«ãªè£œåã³ã³ãã£ã®ã¥ã¬ãŒã¿ãããŒã³ãããåã«ãChrome DevToolsã®ããã©ãŒãã³ã¹ã¿ãã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã培åºçã«ãããã¡ã€ãªã³ã°ããŸããWebGLã®ã¬ã³ããªã³ã°æéãåæããå®è¡æéã®é·ãæäœãç¹å®ããŠæé©åããŸãããšãŒããããã¢ã¡ãªã«ãªã©ã®åžå Žã§ã®ãã¹ãäžã«FPSã«ãŠã³ã¿ãŒã䜿çšããŠãããŸããŸãªããã€ã¹æ§æã§äžè²«ããããã©ãŒãã³ã¹ã確ä¿ããŸãã
ã¯ãã¹ãã©ãããã©ãŒã ã«é¢ããèæ ®äºé ãšã°ããŒãã«ãªåœ±é¿
ã°ããŒãã«ãªèŠèŽè åãã«WebGLã¢ããªã±ãŒã·ã§ã³ãæé©åããå Žåãã¯ãã¹ãã©ãããã©ãŒã ã®äºææ§ãšäžçäžã®ããã€ã¹ã®å€æ§ãªæ©èœãèæ ®ããããšãäžå¯æ¬ ã§ãã
- ããã€ã¹ã®å€æ§æ§ïŒ ãŠãŒã¶ãŒã¯ããã€ãšã³ãã®ã²ãŒãã³ã°PCããäœæ¶è²»é»åã®ã¹ããŒããã©ã³ãŸã§ãå¹ åºãããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŸããããŸããŸãªç»é¢è§£å床ãGPUæ©èœãã¡ã¢ãªå¶çŽãæã€ããŸããŸãªããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŸãã
- ãã©ãŠã¶ã®äºææ§ïŒ WebGLã¢ããªã±ãŒã·ã§ã³ããããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒWindowsãmacOSãAndroidãiOSïŒã§äººæ°ã®ãããã©ãŠã¶ïŒChromeãFirefoxãSafariãEdgeïŒã®ææ°ããŒãžã§ã³ãšäºææ§ãããããšã確èªããŸãã
- ã¢ãã€ã«ã®æé©åïŒ ã¢ãã€ã«ããã€ã¹ã¯ãGPUã®ã¡ã¢ãªåž¯åå¹ ãšåŠçèœåãéãããŠããããšããããããŸãããã¯ã¹ãã£å§çž®ãã¢ãã«ã®ç°¡ç¥åããã®ä»ã®ã¢ãã€ã«åºæã®æé©åæè¡ã䜿çšããŠãã¢ãã€ã«ããã€ã¹åãã«ã¢ããªã±ãŒã·ã§ã³ãç¹å¥ã«æé©åããŸãã
- ãããã¯ãŒã¯ç¶æ³ïŒ ããŸããŸãªå°åã®ãããã¯ãŒã¯ç¶æ³ãèæ ®ããŸããäžéšã®å°åã®ãŠãŒã¶ãŒã¯ãã€ã³ã¿ãŒãããæ¥ç¶ãé ãå ŽåããããŸãã転éãããããŒã¿éãšãªãœãŒã¹ã®èªã¿èŸŒã¿ã«ãããæéãæå°éã«æããããã«ã¢ããªã±ãŒã·ã§ã³ãæé©åããŸãã
- ããŒã«ã©ã€ãŒãŒã·ã§ã³ïŒ ã¢ããªã±ãŒã·ã§ã³ãäžçäžã§äœ¿çšãããå Žåã¯ãããŸããŸãªèšèªãæåããµããŒãããããã«ã³ã³ãã³ããšãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãããŒã«ã©ã€ãºããããšãæ€èšããŸããããã«ãããããŸããŸãªåœã®ãŠãŒã¶ãŒã®ãŠãŒã¶ãŒäœéšãåäžããŸãã
äŸïŒ å šäžçã®ãªã¢ã«ã¿ã€ã æ°è±¡æ å ±ã衚瀺ããWebGLããŒã¹ã®ã€ã³ã¿ã©ã¯ãã£ãããããå§çž®ãã¯ã¹ãã£ãšã¢ãã«ã®ç°¡ç¥åã䜿çšããŠãã¢ãã€ã«ããã€ã¹åãã«ã¢ããªã±ãŒã·ã§ã³ãæé©åããŸããããã€ã¹ã®æ©èœãšãããã¯ãŒã¯ç¶æ³ã«åºã¥ããŠãããŸããŸãªè©³çްã¬ãã«ãæäŸããŸããããŸããŸãªèšèªãšæåç奜ã¿ã«åãããŠããŒã«ã©ã€ãºããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸããã€ã³ãã©ç¶æ³ãç°ãªãåœã§ããã©ãŒãã³ã¹ããã¹ãããäžçäžã§ã¹ã ãŒãºãªäœéšãä¿èšŒããŸãã
çµè«ïŒWebGLã®åè¶æ§ãç®æãç¶ç¶çãªæé©å
GPUã¡ã¢ãªåž¯åå¹ ã®æé©åã¯ã髿§èœãªWebGLã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§éåžžã«éèŠãªåŽé¢ã§ãããã®ããã°èšäºã§èª¬æããããã«ããã¯ãçè§£ãããã¯ããã¯ãå®è£ ããããšã§ãWebGLã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããã°ããŒãã«ãªèŠèŽè ã«ããè¯ããŠãŒã¶ãŒäœéšãæäŸã§ããŸããæé©åã¯ç¶ç¶çãªããã»ã¹ã§ããããšãå¿ããªãã§ãã ãããç¶ç¶çã«ããã©ãŒãã³ã¹ãç£èŠããããŸããŸãªãã¯ããã¯ã詊ããææ°ã®WebGLéçºãšãã¹ããã©ã¯ãã£ã¹ãåžžã«ææ¡ããŠãã ããã倿§ãªããã€ã¹ããããã¯ãŒã¯ãè¶ããŠé«å質ãªã°ã©ãã£ãã¯ã¹äœéšãæäŸããèœåã¯ã仿¥ã®ãŠã§ãç°å¢ã§æåããããã®éµã§ããç¶ç¶çã«æé©åã«åªããããšã§ãWebGLã¢ããªã±ãŒã·ã§ã³ãèŠèŠçã«é åçã§ãããšåæã«ããã©ãŒãã³ã¹ãé«ããäžçäžã®èŠèŽè ã«å¯Ÿå¿ãããã¹ãŠã®äººå£çµ±èšããã³ã°ããŒãã«å°åã§ããžãã£ããªãŠãŒã¶ãŒäœéšãè²ãããšãã§ããŸããæé©åã®æ ã¯ãã¢ãžã¢ã®ãšã³ããŠãŒã¶ãŒããåç±³ã®éçºè ãŸã§ãWebGLãäžçäžã§ã¢ã¯ã»ã¹å¯èœã§é«æ§èœã«ããããšã§ããã¹ãŠã®äººã«å©çããããããŸãã